package com.study.kt._03coroutines

import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.buffer
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.runBlocking
import kotlin.system.measureTimeMillis

/**
 * <pre>
 *     author : slx
 *     time   : 2021/04/04
 *     desc   : buffer 对发射的缓冲，减少等待时间
 * </pre>
 */
fun main() {
    runBlocking {
        val time = measureTimeMillis {
            // 使用buffer比不使用耗时短
            getFlowList().buffer().collect {
                // 模拟一个耗时操作，该操作完成后才开始流的发射，使用buffer后流发射不需要等待而是放入缓冲区，不会浪费时间
                delay(200)
                println(it)
            }
        }
        println("耗时：$time")
    }
}

private fun getFlowList(): Flow<Int> = flow {
    for (i in 1..4) {
        delay(100)
        emit(i)
    }
}